package com.t3go.t3_map.service;

import android.content.Context;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.shareware.common.utils.LogExtKt;
import com.t3go.passenger.router.IMapFoundationService;
import com.t3map.api.map.T3CameraUpdate;
import com.t3map.api.map.T3CameraUpdateFactory;
import com.t3map.api.map.T3Map;
import com.t3map.api.map.model.T3CameraPosition;
import com.t3map.api.map.model.T3LatLng;
import com.t3map.api.map.model.T3LatLngBounds;
import com.t3map.api.utils.LogUtils;

@Route(path = MapFoundationServiceImpl.FOUNDATION_SERVICE)
public class MapFoundationServiceImpl implements IMapFoundationService {
    public static final String FOUNDATION_SERVICE = "/map_foundation/router_service";

    /**
     * 俯仰角0°~45°（垂直与地图时为0）
     */
    private static final int PITCH_ANGLE = 0;

    /**
     * 偏航角 0~360° (正北方为0)
     */
    private static final int YAW_ANGLE = 0;

    /**
     * 地图缩放级别 16
     */
    private static final int FINAL_SCALE_LEVEL_16 = 16;

    /**
     * 地图缩放级别 17
     */
    private static final int FINAL_SCALE_LEVEL_17 = 17;

    /**
     * 移动地图到指定的点所需时间，单位ms。值越大移动速度越慢
     */
    public static final long MAP_MOVE_ANIM_DURATION = 500L;

    @Override
    public void moveMap(T3Map map, T3LatLng latLng) {
        if (null != map) {
            map.moveCamera(getChangeLatLng(latLng));
        }
    }

    @Override
    public void moveMapByNewCameraPosition(T3Map map, T3LatLng latLng) {
        if (null != map) {
            map.animateCamera(getUpdate_16(latLng));
        }
    }

    @Override
    public void animateMoveMapByNewLatLng(T3Map map, T3LatLng latLng) {
        if (null != map) {
            map.animateCamera(getNewLatLngZoom(latLng), MAP_MOVE_ANIM_DURATION, null);
        }
    }

    @Override
    public void animateMoveMap_16(T3Map map, T3LatLng latLng) {
        if (null != map) {
            map.animateCamera(getUpdate_16(latLng), MAP_MOVE_ANIM_DURATION, null);
        }
    }

    @Override
    public void animateMoveMap_16(T3Map map, T3LatLng latLng, int duration) {
        if (null != map) {
            map.animateCamera(getUpdate_16(latLng), duration, null);
        }
    }

    @Override
    public void animateMoveMap_17(T3Map map, T3LatLng latLng) {
        if (null != map) {
            map.animateCamera(getUpdate_17(latLng), MAP_MOVE_ANIM_DURATION, null);
        }
    }

    @Override
    public void animateMoveMap_17(T3Map map, T3LatLng latLng, int duration) {
        if (null != map) {
            map.animateCamera(getUpdate_17(latLng), duration, null);
        }
    }

    @Override
    public void animateMoveMap_17(T3Map map, T3LatLng latLng, T3Map.CancelableCallback callback) {
        if (null != map) {
            map.animateCamera(getUpdate_17(latLng), MAP_MOVE_ANIM_DURATION, callback);
        }
    }

    @Override
    public void animateMoveMapBynNewLatLngBoundsRect(T3Map map, T3LatLngBounds t3LatLngBounds, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom) {
        if (null != map) {
            map.animateCamera(getNewLatLngBoundsRect(t3LatLngBounds, paddingLeft, paddingRight, paddingTop, paddingBottom), MAP_MOVE_ANIM_DURATION, null);
        }
    }

    @Override
    public void moveMapByChangeLatLng(T3Map map, T3LatLng latLng) {
        if (null != map) {
            map.animateCamera(getChangeLatLng(latLng), 250, null);
        }
    }

    @Override
    public void moveMapByChangeLatLngWithDiffPoints(T3Map map, T3LatLng latLng, int duration, T3Map.CancelableCallback callback) {
        if (null != map) {
            T3CameraUpdate t3CameraUpdate = getChangeLatLng(latLng);
            if (map.isSameCameraPosition(t3CameraUpdate, map.getCameraPosition())) {
                LogExtKt.log("T3Map", LogUtils.FENCE + "animateCamera_3 -> 已经是目标点了，不需要移动。 ");
                return;
            }
            map.animateCamera(t3CameraUpdate, duration, callback);
        }
    }

    @Override
    public void moveMapBynNewLatLngBoundsRect(T3Map map, T3LatLngBounds bounds, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom) {
        if (null != map) {
            map.moveCamera(getNewLatLngBoundsRect(bounds, paddingLeft, paddingRight, paddingTop, paddingBottom));
        }
    }

    @Override
    public void init(Context context) {

    }

    /**
     * 返回一个定义了可视区域移动位置CameraUpdate 对象。
     *
     * @param latLng
     * @return
     */
    private T3CameraUpdate getUpdate_16(T3LatLng latLng) {
        return T3CameraUpdateFactory.newCameraPosition(
                new T3CameraPosition(latLng,//新的中心点坐标
                        FINAL_SCALE_LEVEL_16, //新的缩放级别
                        PITCH_ANGLE, //俯仰角0°~45°（垂直与地图时为0）
                        YAW_ANGLE  ////偏航角 0~360° (正北方为0)
                ));
    }

    /**
     * 返回一个定义了可视区域移动位置CameraUpdate 对象。
     *
     * @param latLng
     * @return
     */
    private T3CameraUpdate getUpdate_17(T3LatLng latLng) {
        return T3CameraUpdateFactory.newCameraPosition(
                new T3CameraPosition(latLng,//新的中心点坐标
                        FINAL_SCALE_LEVEL_17, //新的缩放级别
                        PITCH_ANGLE, //俯仰角0°~45°（垂直与地图时为0）
                        YAW_ANGLE  ////偏航角 0~360° (正北方为0)
                ));
    }

    /**
     * 返回一个CameraUpdate对象，只改变地图可视区域中心点，地图缩放级别不变。
     *
     * @param latLng
     * @return
     */
    private T3CameraUpdate getChangeLatLng(T3LatLng latLng) {
        return T3CameraUpdateFactory.newLatLng(latLng);
    }

    /**
     * 返回一个CameraUpdate 对象，包括可视区域框移动目标点屏幕中心位置的经纬度以及缩放级别。
     *
     * @param latLng
     * @return
     */
    private T3CameraUpdate getNewLatLngZoom(T3LatLng latLng) {
        return T3CameraUpdateFactory.newLatLngZoom(latLng, FINAL_SCALE_LEVEL_16);
    }

    /**
     * 把地图移动到指定经纬度范围，以适应当前屏幕的显示，并且可以为上下左右分别设置填充的像素
     *
     * @param t3LatLngBounds
     * @param paddingLeft
     * @param paddingRight
     * @param paddingTop
     * @param paddingBottom
     * @return
     */
    private T3CameraUpdate getNewLatLngBoundsRect(T3LatLngBounds t3LatLngBounds, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom) {
        return T3CameraUpdateFactory.newLatLngBoundsRect(t3LatLngBounds, paddingLeft, paddingRight, paddingTop, paddingBottom);
    }
}
